package com.fan.base.utils;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.fan.base.enums.DateStyle;

public class DateUtils {

	// 线程本地变量，会对每个线程提供一个变量，防止并发
	private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();
	// 这个对象用来加锁用的，防止多线程同时对threadLocal进行写操作，不能直接锁threadLocal，如果异常，可能会导致线程死锁
	private static final Object lockObject = new Object();

	/**
	 * 私有构造方法，不允许实例化
	 */
	private DateUtils() {

	}

	/**
	 * 获取时间类型模板对象
	 * 
	 * @param pattern
	 * @return
	 */
	private static SimpleDateFormat getDateFormat(String pattern) {
		SimpleDateFormat sdf = threadLocal.get();
		if (sdf == null) {
			sdf = new SimpleDateFormat(pattern);
			sdf.setLenient(false);
			synchronized (lockObject) {
				threadLocal.set(sdf);
			}
		}
		sdf.applyPattern(pattern);
		return sdf;
	}

	/**
	 * 毫秒数转换为时间
	 * 
	 * @param timestamp
	 * @return
	 */
	public static Date getDateByLong(Long timestamp) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(timestamp);
		return calendar.getTime();
	}

	/**
	 * 字符串格式转时间格式
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Date getDate(String dateStr) {
		DateStyle style = getDateStyle(dateStr);
		try {
			if (style != null) {
				return getDateFormat(style.getCode()).parse(dateStr);
			}
		} catch (ParseException e) {
			;
		}
		return null;
	}

	/**
	 * 时间转成特定格式字符串
	 * 
	 * @param date
	 *            待转换时间
	 * @param pattern
	 *            转换后字符串格式
	 * @return
	 */
	public static String toString(Date date, DateStyle style) {
		if (style != null) {
			try {
				return getDateFormat(style.getCode()).format(date);
			} catch (Exception e) {
				;
			}
		}
		return null;
	}

	/**
	 * 时间转成特定格式字符串
	 * 
	 * @param date
	 *            待转换时间
	 * @param pattern
	 *            转换后字符串格式
	 * @return
	 */
	public static String toString(Date date, String style) {
		if (style != null) {
			try {
				return getDateFormat(style).format(date);
			} catch (Exception e) {
				;
			}
		}
		return null;
	}

	/**
	 * 获取字符串时间对应的时间格式类型
	 * 
	 * @param dateStr
	 * @return
	 */
	public static DateStyle getDateStyle(String dateStr) {
		for (DateStyle dateStyle : DateStyle.values()) {
			try {
				ParsePosition parsePosition = new ParsePosition(0);
				Date date = getDateFormat(dateStyle.getCode()).parse(dateStr,
						parsePosition);
				if (parsePosition.getIndex() != dateStr.length()) {
					date = null;
				}
				if (parsePosition.getIndex() == dateStr.length()
						&& date != null) {
					return dateStyle;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return null;
	}
}
